package com.operator.Activitys.fragment;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.facebook.drawee.view.SimpleDraweeView;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.MsgNoticeActivity;
import com.operator.Activitys.activity.MyBalanceActivity;
import com.operator.Activitys.activity.MyOrderActivity;
import com.operator.Activitys.activity.PurchaseOrderActivity;
import com.operator.Activitys.activity.PutForwardActivity;
import com.operator.Activitys.activity.RechargeActivity;
import com.operator.Activitys.activity.SalesRecordActivity;
import com.operator.Activitys.activity.SearchShopActivity;
import com.operator.Activitys.activity.SetUpActivity;
import com.operator.Activitys.activity.ShopConfirmActivity;
import com.operator.Activitys.activity.ShopMsgActivity;
import com.operator.Activitys.activity.ShopUpdateConfirmActivity;
import com.operator.Activitys.activity.StockQueryActivity;
import com.operator.Activitys.bean.InspectUpdateBean;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.bean.UploadImage;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.fragment.base.BaseFragment;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.FileUtils;
import com.operator.Activitys.utils.FrescoUtils;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.LogUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.zhy.autolayout.AutoLinearLayout;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.io.File;
import java.io.IOException;

import butterknife.Bind;
import butterknife.OnClick;
import io.github.lizhangqu.coreprogress.ProgressHelper;
import io.github.lizhangqu.coreprogress.ProgressUIListener;
import me.nereo.multi_image_selector.MultiImageSelector;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import static com.operator.Activitys.utils.Constant.SHOP_CONFIRM_AUDIT;
import static com.operator.Activitys.utils.Constant.SHOP_CONFIRM_YES;

/**
 * 项目名称：金泽云 手机app
 * 类描述：我的页面
 * 创建人：张飞祥
 * 创建时间：2018/4/27 14:29
 * 修改人：张飞祥
 * 修改时间：2018/4/27 14:29
 * 修改备注：
 */
public class MyFragment extends BaseFragment {

    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //头像
    @Bind(R.id.sv_my_user_icon)
    SimpleDraweeView svMyUserIcon;
    //商铺名称
    @Bind(R.id.tv_my_name)
    TextView tvMyName;
    //商户认证
    @Bind(R.id.btn_my_attestation)
    Button btnMyAttestation;
    //余额
    @Bind(R.id.tv_my_balance)
    TextView tvMyBalance;
    //apk更新小红点
    @Bind(R.id.iv_system_red)
    ImageView ivSystemRed;

    //内存中用户实体
    protected User mACacheUser = null;

    //头像上传 返回 的 url 地址
    private String mHttpUpdateUrl = "";

    //TODO 初始化网络请求
    public UserManager mApiManager;

    //APP 检查更新 实体类
    private InspectUpdateBean inspectUpdate = null;
    //本地 版本号
    private int versionCode;
    //本地 版本名称
    private String versionName;

    @Override
    protected void initViews() {
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(getActivity(), getActivity().getTaskId());

        //设置标题
        tvTitle.setText("我的");
        //设置标题颜色
        tvTitle.setTextColor(Color.parseColor("#6699ff"));

        //获取内存用户实体
        mACacheUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);

        //TODO 配置当前用户数据
        if (mACacheUser != null) {
            //商铺头像
            FrescoUtils.loadImage(mACacheUser.getImgUrl(), svMyUserIcon);
            //商铺名称
            tvMyName.setText(mACacheUser.getStoreName());
            //商铺余额
            if (mACacheUser.getRemainder() == 0)
                tvMyBalance.setText(0 + " 元");
            else
                tvMyBalance.setText(mACacheUser.getRemainder() + " 元");
            //TODO 判断店铺 是否 认证
            if (Constant.SHOP_CONFIRM_YES.equals(mACacheUser.getIsCertified()))
                btnMyAttestation.setText("已认证");
            else if (Constant.SHOP_CONFIRM_AUDIT.equals(mACacheUser.getIsCertified()))
                btnMyAttestation.setText("待审核");
            else
                btnMyAttestation.setText("未认证");
        }

        /**
         * 创建 Gson 解析 实体类
         */
        //TODO 解析 APP检查更新 实体
        inspectUpdate = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_APP_UPDATE) + "", InspectUpdateBean.class);

        /**
         * 判断 是否显示 检查更新小红点
         */
        //获取 本地 版本号
        versionCode = FileUtils.getLocalVersion(getActivity());
        //获取 本地 版本名称
        versionName = FileUtils.getLocalVersionName(getActivity());
        //TODO 业务逻辑判断
        if (inspectUpdate != null) {
            if (inspectUpdate.getVersionCode() > versionCode)
                //显示 检查更新按钮出现小红点
                ivSystemRed.setVisibility(View.VISIBLE);
            else
                //隐藏 检查更新出现小红点
                ivSystemRed.setVisibility(View.GONE);
        }
    }

    /**
     * 按钮点击事件
     *
     * @return
     */

    @Bind(R.id.layout_my_order)
    AutoLinearLayout layoutMyOrder;

    @OnClick({R.id.sv_my_user_icon, R.id.tv_my_balance, R.id.btn_my_attestation, R.id.btn_my_recharge, R.id.btn_my_put_forward,
            R.id.btn_my_transfer, R.id.layout_my_shop, R.id.layout_my_stock, R.id.layout_my_order,
            R.id.layout_my_purchase_order, R.id.layout_my_internet, R.id.layout_my_sale, R.id.layout_my_phone,
            R.id.layout_msg_notice, R.id.layout_my_set_up})
    public void onClick(View view) {

        //TODO 向下跳转 所传递 的 Bundle
        Bundle bundle = new Bundle();

        switch (view.getId()) {
            case R.id.sv_my_user_icon:      //头像
                //TODO 修改 当前头像图片 数据
                selectPicture();
                break;
            case R.id.tv_my_balance:      //余额点击
                JumperUtils.JumpTo(getActivity(), MyBalanceActivity.class);
                break;
            case R.id.btn_my_attestation:   //商户认证
                /**
                 * 判断店铺 是否 认证
                 * 1.未认证跳转事件
                 * 2.已认证跳转事件
                 */
                if (Constant.SHOP_CONFIRM_NO.equals(mACacheUser.getIsCertified()))
                    //跳转未认证
                    JumperUtils.JumpTo(getActivity(), ShopConfirmActivity.class);
                else if (Constant.SHOP_CONFIRM_YES.equals(mACacheUser.getIsCertified()))
                    //跳转已认证
                    JumperUtils.JumpTo(getActivity(), ShopUpdateConfirmActivity.class);
                break;
            case R.id.btn_my_recharge:      //充值
                //TODO 判断是否被冻结
                if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState()))
                    JumperUtils.JumpTo(getActivity(), RechargeActivity.class);
                else
                    ToastUtils.showShort(getActivity(), getResources().getString(R.string.shop_state_no));
                break;
            case R.id.btn_my_put_forward:   //提现
                //TODO 判断是否被冻结
                if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState()))
                    JumperUtils.JumpTo(getActivity(), PutForwardActivity.class);
                else
                    ToastUtils.showShort(getActivity(), getResources().getString(R.string.shop_state_no));
                break;
            case R.id.btn_my_transfer:      //转账
                //TODO 判断是否被冻结
                if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState()))
                    JumperUtils.JumpTo(getActivity(), SearchShopActivity.class);
                else
                    ToastUtils.showShort(getActivity(), getResources().getString(R.string.shop_state_no));
                break;
            case R.id.layout_my_shop:       //店铺信息
                JumperUtils.JumpTo(getActivity(), ShopMsgActivity.class);
                break;
            case R.id.layout_my_stock:      //库存查询
                JumperUtils.JumpTo(getActivity(), StockQueryActivity.class);
                break;
            case R.id.layout_my_order:      //我的订单
                JumperUtils.JumpTo(getActivity(), MyOrderActivity.class);
                break;
            case R.id.layout_my_purchase_order:  //进货订单
                JumperUtils.JumpTo(getActivity(), PurchaseOrderActivity.class);
                break;
            case R.id.layout_my_internet:   //宽带销售记录
                bundle.putInt(Constant.INTENT_SALES_TAG, 1);
                JumperUtils.JumpTo(getActivity(), SalesRecordActivity.class, bundle);
                break;
            case R.id.layout_my_sale:       //号卡销售记录
                bundle.putInt(Constant.INTENT_SALES_TAG, 0);
                JumperUtils.JumpTo(getActivity(), SalesRecordActivity.class, bundle);
                break;
            case R.id.layout_my_phone:      //业务员电话
                //获取当前业务员电话
                String phoneNumber = mACacheUser.getCountermanTel();

                /**
                 * 判断 当前店铺是否有 业务员电话
                 *
                 * true： 则直接跳转拨号页面
                 * false：则弹出相应的提示信息
                 */
                if (!phoneNumber.equals("") || phoneNumber != null) {
                    Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber));
                    startActivity(dialIntent);
                } else {
                    ToastUtils.showShort(getActivity(), "您还没有设置业务员电话，请在店铺信息修改！");
                }
                break;
            case R.id.layout_msg_notice:    //推送消息
                JumperUtils.JumpTo(getActivity(), MsgNoticeActivity.class);
                break;
            case R.id.layout_my_set_up:     //设置
                JumperUtils.JumpTo(getActivity(), SetUpActivity.class);
                break;
        }
    }


    /**
     * 选择自定义图片
     */
    private void selectPicture() {
        /**
         *
         *  特此注意：由于Android 6.0 的权限是一套新的授权机制，所以在用法上也格外的不同。
         *  在此 MultiImageSelector（仿微信图片浏览）框架 会显示 “无权限”
         *  在此要对机型动态的获取文件读写权限
         *
         */
        String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, Constant.REQUEST_EXTERNAL_STORAGE);
        }
        //调用 MultiImageSelector 图片预览功能

        MultiImageSelector.create(getActivity())
                .showCamera(true)
                .single() // 单选模式
                .start(getActivity(), Constant.REQUEST_IMAGE);
    }

    /**
     * 极光推送 店铺认证结果
     */
    @Subscriber(tag = Constant.BUS_JPUSH_SHOP_CONFIRM_TAG)
    public void onJpushShopConfirmTag(String pushTag) {
        //TODO 判断店铺 认证标记 tag
        if (SHOP_CONFIRM_YES.equals(pushTag))
            btnMyAttestation.setText("已认证");
        else if (SHOP_CONFIRM_AUDIT.equals(pushTag))
            btnMyAttestation.setText("待审核");
        else
            btnMyAttestation.setText("未认证");

        //TODO 更新内存中的店铺信息 认证标记 实体
        mACacheUser.setIsCertified(pushTag);
    }

    /**
     * 极光推送 店铺 冻结结果
     */
    @Subscriber(tag = Constant.BUS_JPUSH_SHOP_FROZEN_TAG)
    public void onJpushShopFrozenTag(String pushTag) {
        mACacheUser.setState(pushTag);
    }

    /**
     * 刷新 用户信息
     */
    @Subscriber(tag = Constant.BUS_MY_USER)
    public void onUserPush(User user) {
        //刷新用户信息
        mACacheUser = user;
        //刷新用户名称
        tvMyName.setText(user.getStoreName());
    }

    /**
     * 刷新 余额信息 信息
     */
    @Subscriber(tag = Constant.BUS_MY_REMAINDER)
    public void onMyRemainderPush(double money) {
        tvMyBalance.setText(money + " 元");
        //TODO 更新 页面上的 店铺实体
        mACacheUser.setRemainder(money);
    }

    /**
     * 接收 裁剪好的 头像 uri 地址
     */
    @Subscriber(tag = Constant.BUS_RECEIVE_MY_URI)
    public void onReceiveMyUri(Uri imgUri) {
        //弹出 dialog
        initShowTimeDialog("准备上传 0% ，请稍候....", getActivity());
        //网络请求 上传头像
        uploadFile(imgUri);
    }

    /**
     * 文件上传 带进度 （okHttp）
     *
     * @param uri
     */
    private void uploadFile(final Uri uri) {
        //获取 要上传的 文件 path
        String filePath = FileUtils.getRealFilePath(getActivity(), uri);
        //添加要上传的文件
        File uploadFile = new File(filePath);
        //要上传的 地址
        String url = Constant.HTTP_URL + "StoreInfo/UploadStoreInfoImg";

        //TODO 创建一个 okHttp 请求
        OkHttpClient okHttpClient = new OkHttpClient();

        //TODO 创建 一个 bodyBuilder
        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();
        bodyBuilder.setType(MultipartBody.FORM);

        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是file
        //此处应该改变
        bodyBuilder.addFormDataPart("file", uploadFile.getName(), RequestBody.create
                (MediaType.parse("application/octet-stream"), uploadFile));
        //构建
        MultipartBody multipartBody = bodyBuilder.build();

        //TODO  获取 上传进度
        RequestBody requestBody = ProgressHelper.withProgress(multipartBody, new ProgressUIListener() {
            @Override
            public void onUIProgressStart(long totalBytes) {
                super.onUIProgressStart(totalBytes);
                LogUtils.i("uploadFile：--------------->开始上传");
            }

            @Override
            public void onUIProgressChanged(long numBytes, long totalBytes, final float percent, float speed) {
                //获取 当前上传 进度
                int progress = (int) (100 * percent);
                //进度 判断 显示
                if (progress < 100)
                    mFrgTimeDialog.setContent("已经上传 " + progress + "% ，请稍候....");

                LogUtils.i("uploadFile：--------------->" + (int) (100 * percent));
            }

            @Override
            public void onUIProgressFinish() {
                super.onUIProgressFinish();
                LogUtils.i("uploadFile：--------------->结束上传");
            }
        });

        //创建Request
        Request request = new Request.Builder().url(url).post(requestBody).build();

        //TODO 获取当前网络请求状态
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            //请求出错
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            //请求成功 返回结果
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //得到服务器返回的具体内容
                String responseData = response.body().string();
                //开始解析 转换为 实体数据
                Gson gson = new Gson();
                UploadImage image = gson.fromJson(responseData + "", UploadImage.class);
                //TODO 网络请求业务逻辑判断
                if (image.getState().equals("1")) {
                    mHttpUpdateUrl = image.getSrc();

                    LogUtils.e("mHttpUpdateUrl:------------->" + mHttpUpdateUrl);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            setHttpUpdateUserIcon();
                        }
                    });
                } else {
                    ToastUtils.showShort(getActivity(), image.getMsg());
                }
            }
        });
    }

    /**
     * 网络请求 更改 用户头像
     */
    private void setHttpUpdateUserIcon() {
        //更改加载信息
        mFrgTimeDialog.setContent("正在更改店铺头像，请耐心等待....");
        //开始网络请求 更改头像
        mApiManager.userUpdateIcon(mACacheUser.getId(), mHttpUpdateUrl);
    }

    /**
     * 网络请求 更改 用户头像 报错
     */
    @Subscriber(tag = Constant.BUS_MY_UPDATE_USER_ICON_ERROR, mode = ThreadMode.MAIN)
    public void initUpdateUserIconError(String httpError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                mFrgTimeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(getActivity(), "修改失败，网络连接不稳定！");
            }
        }, 1000);
    }

    /**
     * 网络请求 更改 用户头像
     */
    @Subscriber(tag = Constant.BUS_MY_UPDATE_USER_ICON, mode = ThreadMode.MAIN)
    public void initUpdateUserIconError(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                mFrgTimeDialog.dismiss();
                //TODO 网络请求业务逻辑判断
                if (state.getState().equals("1")) {
                    mHttpUpdateUrl = Constant.HTTP_URL + mHttpUpdateUrl;
                    //保存新的 店铺头像
                    mACacheUser.setImgUrl(mHttpUpdateUrl);
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mACacheUser));
                    //更新 店铺头像
                    FrescoUtils.loadImage(mHttpUpdateUrl, svMyUserIcon);
                }
                //弹出相应的提示
                ToastUtils.showShort(getActivity(), state.getMsg());
            }
        }, 1000);
    }

    @Override
    protected int getContentViewId() {
        return R.layout.frg_my;
    }
}
